package hust.ioic.oa.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHyperlink;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 
 * @描述：测试excel读取
 *               导入的jar包
 *               poi-3.8-beta3-20110606.jar
 *               poi-ooxml-3.8-beta3-20110606.jar
 *               poi-examples-3.8-beta3-20110606.jar
 *               poi-excelant-3.8-beta3-20110606.jar
 *               poi-ooxml-schemas-3.8-beta3-20110606.jar
 *               poi-scratchpad-3.8-beta3-20110606.jar
 *               xmlbeans-2.3.0.jar
 *               dom4j-1.6.1.jar
 * @时间：2012-08-29 下午16:27:15
 */

public class ImportExecl
{

	/** 总行数 */

	private int totalRows = 0;

	/** 总列数 */

	private int totalCells = 0;

	/** 错误信息 */

	private String errorInfo;

	/** 构造方法 */

	public ImportExecl()
	{

	}

	/**
	 * 
	 * @描述：得到总行数
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:27:15
	 * 
	 * @参数：@return
	 * 
	 * @返回值：int
	 */

	public int getTotalRows()
	{

		return totalRows;

	}

	/**
	 * 
	 * @描述：得到总列数
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:27:15
	 * 
	 * @参数：@return
	 * 
	 * @返回值：int
	 */

	public int getTotalCells()
	{

		return totalCells;

	}

	/**
	 * 
	 * @描述：得到错误信息
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:27:15
	 * 
	 * @参数：@return
	 * 
	 * @返回值：String
	 */

	public String getErrorInfo()
	{

		return errorInfo;

	}

	/**
	 * 
	 * @描述：验证excel文件
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:27:15
	 * 
	 * @参数：@param filePath　文件完整路径
	 * 
	 * @参数：@return
	 * 
	 * @返回值：boolean
	 */

	public boolean validateExcel(String filePath,File file)
	{

		/** 检查文件名是否为空或者是否是Excel格式的文件 */

		if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath)))
		{

			errorInfo = "文件名不是excel格式";

			return false;

		}

		/** 检查文件是否存在 */

	/*	File file = new File(filePath);*/

		if (file == null || !file.exists())
		{

			errorInfo = "文件不存在";

			return false;

		}

		return true;

	}

	/**
	 * 
	 * @描述：根据文件名读取excel文件
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:27:15
	 * 
	 * @参数：@param filePath 文件完整路径
	 * 
	 * @参数：@return
	 * 
	 * @返回值：List
	 */

	public List<List<String>> read(String filePath,File file,int i)
	{

		List<List<String>> dataLst = new ArrayList<List<String>>();

		InputStream is = null;

		try
		{

			/** 验证文件是否合法 */

			if (!validateExcel(filePath,file))
			{

				System.out.println(errorInfo);

				return null;

			}

			/** 判断文件的类型，是2003还是2007 */

			boolean isExcel2003 = true;

			if (WDWUtil.isExcel2007(filePath))
			{

				isExcel2003 = false;

			}

			/** 调用本类提供的根据流读取的方法 */

	/*		File file = new File(filePath);*/

			is = new FileInputStream(file);

			dataLst = read(is, isExcel2003,i);

			is.close();

		}
		catch (Exception ex)
		{

			ex.printStackTrace();

		}
		finally
		{

			if (is != null)
			{

				try
				{

					is.close();

				}
				catch (IOException e)
				{

					is = null;

					e.printStackTrace();

				}

			}

		}

		/** 返回最后读取的结果 */

		return dataLst;

	}

	/**
	 * 
	 * @描述：根据流读取Excel文件
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:40:15
	 * 
	 * @参数：@param inputStream
	 * 
	 * @参数：@param isExcel2003
	 * 
	 * @参数：@return
	 * 
	 * @返回值：List
	 */

	public List<List<String>> read(InputStream inputStream, boolean isExcel2003,int i)
	{

		List<List<String>> dataLst = null;

		try
		{

			/** 根据版本选择创建Workbook的方式 */

			Workbook wb = null;

			if (isExcel2003)
			{
				wb = new HSSFWorkbook(inputStream);
			}
			else
			{
				wb = new XSSFWorkbook(inputStream);
			}
			dataLst = read(wb,i);

		}
		catch (IOException e)
		{

			e.printStackTrace();

		}

		return dataLst;

	}

	/**
	 * 
	 * @描述：读取数据
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:50:15
	 * 
	 * @参数：@param Workbook
	 * 
	 * @参数：@return
	 * 
	 * @返回值：List<List<String>>
	 */

	private List<List<String>> read(Workbook wb,int i)
	{

		List<List<String>> dataLst = new ArrayList<List<String>>();

		/** 得到第一个shell */

		Sheet sheet = wb.getSheetAt(i-1);

		/** 得到Excel的行数 */

		this.totalRows = sheet.getPhysicalNumberOfRows();

		/** 得到Excel的列数 */

		if (this.totalRows >= 1 && sheet.getRow(0) != null)
		{

			this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();

		}

		/** 循环Excel的行 */

		for (int r = 0; r < this.totalRows; r++)
		{

			Row row = sheet.getRow(r);

			if (row == null)
			{

				continue;

			}

			List<String> rowLst = new ArrayList<String>();

			/** 循环Excel的列 */

			for (int c = 0; c < this.getTotalCells(); c++)
			{

				Cell cell = row.getCell(c);

				String cellValue = "";

				if (null != cell)
				{
					// 以下是判断数据的类型
					switch (cell.getCellType())
					{
					case HSSFCell.CELL_TYPE_NUMERIC: // 数字
						cellValue = cell.getNumericCellValue() + "";
						break;

					case HSSFCell.CELL_TYPE_STRING: // 字符串
						cellValue = cell.getStringCellValue();
						break;

					case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
						cellValue = cell.getBooleanCellValue() + "";
						break;

					case HSSFCell.CELL_TYPE_FORMULA: // 公式
						cellValue = cell.getCellFormula() + "";
						break;

					case HSSFCell.CELL_TYPE_BLANK: // 空值
						cellValue = "";
						break;

					case HSSFCell.CELL_TYPE_ERROR: // 故障
						cellValue = "非法字符";
						break;
					
					default:
						cellValue = "未知类型";
						break;
					}
				}

				rowLst.add(cellValue);

			}

			/** 保存第r行的第c列 */

			dataLst.add(rowLst);

		}

		return dataLst;

	}

	/**
	 * 
	 * @描述：main测试方法
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午17:12:15
	 * 
	 * @参数：@param args
	 * 
	 * @参数：@throws Exception
	 * 
	 * @返回值：void
	 */

/*	public static void main(String[] args) throws Exception
	{

		ImportExecl poi = new ImportExecl();
File file=new File("E:\\student.xlsx");
		List<List<String>> list = poi.read("student.xlsx",file);

		if (list != null)
		{

			for (int i = 1; i < list.size(); i++)
			{

				List<String> cellList = list.get(i);

				for (int j = 0; j < cellList.size(); j++)
				{

					System.out.print("    " + cellList.get(j));

				}
				System.out.println();

			}

		}

	}*/
public void exceldo(){
	  HSSFWorkbook wb = new HSSFWorkbook();

      // 创建Excel的工作sheet,对应到一个excel文档的tab
      HSSFSheet sheet = wb.createSheet("sheet1");

      // 设置excel每列宽度
      sheet.setColumnWidth(0, 4000);
      sheet.setColumnWidth(1, 3500);

      // 创建字体样式
      HSSFFont font = wb.createFont();
      font.setFontName("Verdana");
      font.setBoldweight((short) 100);
      font.setFontHeight((short) 300);
      font.setColor(HSSFColor.BLUE.index);

      // 创建单元格样式
      HSSFCellStyle style = wb.createCellStyle();
      style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
      style.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index);
      style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

      // 设置边框
      style.setBottomBorderColor(HSSFColor.RED.index);
      style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
      style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
      style.setBorderRight(HSSFCellStyle.BORDER_THIN);
      style.setBorderTop(HSSFCellStyle.BORDER_THIN);

      style.setFont(font);// 设置字体

      // 创建Excel的sheet的一行
      HSSFRow row = sheet.createRow(0);
      row.setHeight((short) 500);// 设定行的高度
      // 创建一个Excel的单元格
      HSSFCell cell = row.createCell(0);

      // 合并单元格(startRow，endRow，startColumn，endColumn)
 

      // 给Excel的单元格设置样式和赋值
      cell.setCellStyle(style);
      cell.setCellValue("hello world");

      // 设置单元格内容格式
      HSSFCellStyle style1 = wb.createCellStyle();
      style1.setDataFormat(HSSFDataFormat.getBuiltinFormat("h:mm:ss"));

      style1.setWrapText(true);// 自动换行

      row = sheet.createRow(1);

      // 设置单元格的样式格式

      cell = row.createCell(0);
      cell.setCellStyle(style1);
      cell.setCellValue(new Date());

      // 创建超链接
      HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);
      link.setAddress("http://www.baidu.com");
      cell = row.createCell(1);
      cell.setCellValue("百度");
      cell.setHyperlink(link);// 设定单元格的链接
try{
	FileOutputStream os = new FileOutputStream("d:\\workbook.xls");
    wb.write(os);
    os.close();
}catch (Exception e){
	
}
      

}
}

/**
 * 
 * @描述：工具类
 * 
 * @作者：建宁
 * 
 * @时间：2012-08-29 下午16:30:40
 */

class WDWUtil
{

	/**
	 * 
	 * @描述：是否是2003的excel，返回true是2003
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:29:11
	 * 
	 * @参数：@param filePath　文件完整路径
	 * 
	 * @参数：@return
	 * 
	 * @返回值：boolean
	 */

	public static boolean isExcel2003(String filePath)
	{

		return filePath.matches("^.+\\.(?i)(xls)$");

	}

	/**
	 * 
	 * @描述：是否是2007的excel，返回true是2007
	 * 
	 * @作者：建宁
	 * 
	 * @时间：2012-08-29 下午16:28:20
	 * 
	 * @参数：@param filePath　文件完整路径
	 * 
	 * @参数：@return
	 * 
	 * @返回值：boolean
	 */

	public static boolean isExcel2007(String filePath)
	{

		return filePath.matches("^.+\\.(?i)(xlsx)$");

	}

}

